#include "my_touch.h"

int TouchRead(uint16_t *x, uint16_t *y) {
	  *x = Read_X_Adc();
    *y = Read_Y_Adc();
    return 1;
}



void Touch_Init() {
    // 启用 GPIO 和 ADC 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	
	  //中断引脚PE4暂时设置为低电平，看看X的ADC是否正常
	  Init_GPIO_Pin(STM32_INT_PORT, STM32_INT_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_DOWN);
	  GPIO_WriteBit(STM32_INT_PORT, STM32_INT_PIN, Bit_RESET);
	
    // 初始化 ADC1
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 使能 ADC1
    ADC_Cmd(ADC1, ENABLE);
}

uint16_t Read_X_Adc(void) {
    X_Init();
	  delay_ms(1);
    // 开始 ADC PA5 采集
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
    ADC_SoftwareStartConv(ADC1);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET);
    return ADC_GetConversionValue(ADC1);
}

uint16_t Read_Y_Adc(void) {
    Y_Init();
	  delay_ms(1);
    // 开始 ADC PA4 采集
    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_3Cycles);
    ADC_SoftwareStartConv(ADC1);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET);
    return ADC_GetConversionValue(ADC1);
}

void Init_GPIO_Pin(GPIO_TypeDef* port, uint16_t pin, GPIOMode_TypeDef mode, GPIOOType_TypeDef otype, GPIOPuPd_TypeDef pupd) {
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = pin;
    GPIO_InitStruct.GPIO_Mode = mode;
    GPIO_InitStruct.GPIO_OType = otype;
    GPIO_InitStruct.GPIO_PuPd = pupd;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(port, &GPIO_InitStruct);
}

void X_Init(void) {
    // 初始化 X 方向引脚
    Init_GPIO_Pin(X_POS_PORT, X_POS_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_DOWN);
	  GPIO_WriteBit(X_POS_PORT, X_POS_PIN, Bit_RESET);
	
    Init_GPIO_Pin(X_NEG_PORT, X_NEG_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_UP);
	  GPIO_WriteBit(X_NEG_PORT, X_NEG_PIN, Bit_SET);
	
    Init_GPIO_Pin(Y_POS_PORT, Y_POS_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_UP);
	  GPIO_WriteBit(Y_POS_PORT, Y_POS_PIN, Bit_SET);
	
    Init_GPIO_Pin(Y_NEG_PORT, Y_NEG_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_DOWN);
	  GPIO_WriteBit(Y_NEG_PORT, Y_NEG_PIN, Bit_RESET);
	
    Init_GPIO_Pin(STM32_YOUT_PORT, STM32_YOUT_PIN, GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL);
}

void Y_Init(void) {
    // 初始化 Y 方向引脚
    Init_GPIO_Pin(Y_POS_PORT, Y_POS_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_DOWN);
	  GPIO_WriteBit(Y_POS_PORT, Y_POS_PIN, Bit_RESET);
	
    Init_GPIO_Pin(Y_NEG_PORT, Y_NEG_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_UP);
	  GPIO_WriteBit(Y_NEG_PORT, Y_NEG_PIN, Bit_SET);
	
    Init_GPIO_Pin(X_POS_PORT, X_POS_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_UP);
	  GPIO_WriteBit(X_POS_PORT, X_POS_PIN, Bit_SET);
	
    Init_GPIO_Pin(X_NEG_PORT, X_NEG_PIN, GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_DOWN);
	  GPIO_WriteBit(X_NEG_PORT, X_NEG_PIN, Bit_RESET);
	
    Init_GPIO_Pin(STM32_XOUT_PORT, STM32_XOUT_PIN, GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL);
}

int compare(const void *a, const void *b) {
    return (*(uint32_t*) a - *(uint32_t*) b);
}

float median(uint32_t arr[], int n) {
    qsort(arr, n, sizeof(uint32_t), compare);
    if (arr[n - 1] - arr[0] > 50)
        return 0;
    if (n % 2 == 0) {
        return ((float) arr[n / 2 - 1] + (float) arr[n / 2]) / 2.0;
    } else {
        return (float) arr[n / 2];
    }
}
